package clases;

public class Paginacion {

    private int paginaActual;
    private int registrosTotales;
    private int registrosPorPagina;

//Constructor
//------------------------------------------------------------------------------
//    
    public Paginacion() {
        //Sin Parámetros para javaBeans
    }

    public Paginacion(int paginaActual, int registrosTotales, int registrosPorPagina) {
        this.paginaActual = paginaActual;
        this.registrosTotales = registrosTotales;
        this.registrosPorPagina = registrosPorPagina;
    }

    public Paginacion(String paginaActual, int registrosTotales, int registrosPorPagina) {
        this.paginaActual = cogePaginaDeString(paginaActual);
        this.registrosTotales = registrosTotales;
        this.registrosPorPagina = registrosPorPagina;
    }
//Getter y Setter
//------------------------------------------------------------------------------
//

    public int getPaginaActual() {
        return paginaActual;
    }

    public void setPaginaActual(int paginaActual) {
        this.paginaActual = paginaActual;
    }

    public int getRegistrosPorPagina() {
        return registrosPorPagina;
    }

    public void setRegistrosPorPagina(int registrosPorPagina) {
        this.registrosPorPagina = registrosPorPagina;
    }

    public int getRegistrosTotales() {
        return registrosTotales;
    }

    public void setRegistrosTotales(int registrosTotales) {
        this.registrosTotales = registrosTotales;
    }

//Métodos
//--------------------------------------------------------------------------
//
    /**
     * Devuelve el número de páginas totales a partir del número de registros
     * totales y el número de registros por página. Haciendo un redondeo hacia
     * arriba.
     * @return int Número de páginas totales
     */
    public int getTotalPaginas() {
        return (int) (Math.ceil((registrosTotales - 1) / registrosPorPagina) + 1);
    }

    /**
     * Indica si existe una página siguiente después de la página actual.
     * @return boolean true o false dependiendo de si existe o no
     */
    public boolean getExisteSiguiente() {
        if (paginaActual >= this.getTotalPaginas()) {
            return false;
        }
        return true;
    }

    /**
     * Indica si existe una página anterior a la página actual.
     * @return boolean true o false dependiendo de si existe o no
     */
    public boolean getExisteAnterior() {
        if (paginaActual <= 1) {
            return false;
        }
        return true;
    }

    /**
     * Devuelve la página siguiente en el caso de que la haya, si no la hay
     * devolverá el valor de la propia página que debe ser por lo tanto la última.
     * @return int número de la página siguiente
     */
    public int getPaginaSiguiente() {
        return getExisteSiguiente() ? paginaActual + 1 : paginaActual;
    }

    /**
     * Devuelve la página anterior en el caso de que la haya, si no la hay
     * devolverá el valor de la propia página que debe ser por lo tanto la primera.
     * @return int número de la página anterior
     */
    public int getPaginaAnterior() {
        return getExisteAnterior() ? paginaActual - 1 : paginaActual;
    }

    //Devuelve el OFFSET que debe incluirse en la base de datos
    public int offset() {
        return (int) ((paginaActual - 1) * registrosPorPagina);
    }

    //Devuelve el LIMIT que debe incluirse en la base de datos
    public int limit() {
        return registrosPorPagina;
    }

    /**
     * Método estatico que sirve para obtener el valor de la página en que estamos
     * a partir del String que podría obtenerse del parametro GET por Ej. lista.jsp?pag=4
     * Este método coge la cadena de pag y lo transforma en el valor de pagina actual.
     * En caso de que el String esté vacío o no sea válido devuelve la primera página.
     * @param paginaActual String que se obtiene por GET
     * @return int número de la página en la que estamos
     */
    public static int cogePaginaDeString(String pag) {
        int pagina = 1;
        //Si la pagina es null se queda con valor cero
        if (pag != null) {
            try {
                //Intentamos pasar el valor a un entero, si no se puede, será cero
                pagina = Integer.parseInt(pag);
                //Si sale un número negativo, será cero
                if (pagina < 1) {
                    pagina = 1;
                }
            } catch (NumberFormatException ex) {
                pagina = 1;
            }
        }
        return pagina;
    }
}
